package 力扣91;

import java.util.ArrayList;

/**
 * @ClassName : Day2_821_字符的最短距离
 * @Author : 骆发茂
 * @Date: 2021/12/13 8:30
 * @Description : https://leetcode-cn.com/problems/shortest-distance-to-a-character/
 * 思路 遍历字符串，找到目标字母，并用a数组记下位置 遍历字符串，
 * 将当前位置与a数组的位置进行相减，取最小值，记住用绝对值。 C语言4ms通过。
 * <p>
 * <p>
 * /** * public E get(int index) {
 * Returns the element at the specified position in this list.
 * // * @param  index index of the element to return
 * @return the element at the specified position in this list
 * // * @throws IndexOutOfBoundsException {@inheritDoc}
 */

public class Day2_821_字符的最短距离 {
    class Solution {
        public int[] shortestToChar(String s, char c) {
            int[] res = new int[s.length()];
            ArrayList<Integer> arr = new ArrayList<>();
            int p = 0;//指向动态数组的索引
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == c) {
                    arr.add(i);//动态数组记录的是char c的位置（索引）
                }
            }
            for (int i = 0; i < s.length(); i++) {
                /*再次遍历s的过程中，我们需要判断当满足以下两点条件时，指针 p 右移一位->>>>>>
                p小于arr最大下标(p不能打过arr.size，p就是arr的索引)
                前下标i 到 p + 1的绝对距离比到 p 的绝对距离小
             就像这样子—》 i是靠近get(p+1)，要不断尝试是靠近哪边   get(p)             i  get(p+1)*/
                //if情况下说明不是靠近char c的左边的，靠近char c 索引的右边，一直查找右边的char c的索引
                if (p < arr.size() - 1 && Math.abs(arr.get(p) - i) > Math.abs(arr.get(p + 1) - i)) {
                    p++;
                }
                res[i] = Math.abs(arr.get(p) - i);
            }
            return res;
        }
    }
}